代码 > 魔改了v8go,实现了long live引擎

2026-01-12

https://github.com/rogchap/v8go

最后是搞定了FinalizationRegistry释放go里的资源了。

首先一同魔改,

auto default_platform = platform::NewDefaultPlatform(0,v8::platform::IdleTaskSupport::kEnabled);

创建platform时加入idletask支持。

然后把PumpMessageLoop和RunIdleTasks extend给go。

通过写了多个snapshot在chrome里分析,具体的gc过程是这样的。

首先,Context Release变量,这时候,变量本身会释放

然后PumpMessageLoop,这时候,变量会从FinalizationRegistry里消失

然后再PumpMessageLoop return true时RunIdleTasks一下,这时候held value会从FinalizationRegistry里消失

这时候要再执行一次RunIdleTasks,才会制定回调。

也就是一次释放,要至少经过3次空闲。

这个问题终于被我搞定了,我都会觉得自己是v8小能手了

点击登录